package org.example.day05;

import java.util.Scanner;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO+
 * 机器人搬砖，一共有N堆砖存放在N个不同的仓库中，第i堆砖中有bricks[i]块砖头，要求在8小时内搬完。机器人每小时能搬砖的数量取决于有多少能量格，机器人一个小时中只能在一个仓库中搬砖，机器人的能量格每小时补充一次且能量格只在这一个小时有效，为使得机器人损耗最小化尽量减小每次补充的能量格数。<br> <div>  为了保障在8小时内能完成搬砖任务，请计算每小时给机器人充能的最小能量格数。 </div> <div>  备注： </div> <div>  1、无需考虑机器人补充能量格的耗时； </div> <div>  2、无需考虑机器人搬砖的耗时； </div> <div>  3、机器人每小时补充能量格只在这一个小时中有效； </div>
 *
 * 机器人搬砖，一共有N堆砖存放在N个不同的仓库中，第i堆砖中有bricks[i]块砖头，要求在8小时内搬完。机器人每小时能搬砖的数量取决于有多少能量格，
 * 机器人一个小时中只能在一个仓库中搬砖，机器人的能量格每小时补充一次且能量格只在这一个小时有效，为使得机器人损耗最小化尽量减小每次补充的能量格数。
 * 为了保障在8小时内能完成搬砖任务，请计算每小时给机器人充能的最小能量格数。
 * 备注：
 * 1、无需考虑机器人补充能量格的耗时；
 * 2、无需考虑机器人搬砖的耗时；
 * 3、机器人每小时补充能量格只在这一个小时中有效；
 * @date 2024/3/11 15:22
 */
public class test099 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取砖块堆数量
        System.out.println("请输入砖块堆的数量，使用空格分隔：");
        String bricksInput = scanner.nextLine();

        // 将输入的砖块堆数量字符串转换为整数列表
        String[] bricksStr = bricksInput.split(" ");
        int[] bricks = new int[bricksStr.length];
        for (int i = 0; i < bricksStr.length; i++) {
            bricks[i] = Integer.parseInt(bricksStr[i]);
        }

        int hours = 8; // 规定的时间（小时）

        // 调用方法找到机器人搬运所有砖块所需的最小能量值
        int minEnergy = findMinEnergy(bricks, hours);

        // 打印结果
        System.out.println(minEnergy);

        scanner.close();
    }

    private static boolean canComplete(int[] bricks, int energy, int hours) {
        int totalHours = 0; // 总共需要的小时数
        for (int brick : bricks) {
            totalHours += (int) Math.ceil((double) brick / energy); // 使用天花板除法计算每堆砖块需要的小时数
        }
        return totalHours <= hours; // 如果总小时数小于等于规定时间，则返回true
    }

    private static int findMinEnergy(int[] bricks, int hours) {
        int totalBricks = 0; // 所有砖块的总和
        for (int brick : bricks) {
            totalBricks += brick;
        }

        for (int energy = 1; energy <= totalBricks; energy++) { // 从1开始逐一尝试每个能量值
            if (canComplete(bricks, energy, hours)) { // 如果当前能量值有效
                return energy; // 返回当前的能量值作为最小有效能量值
            }
        }

        return -1; // 如果找不到有效的能量值，返回-1
    }
}

